/**
 * 1 compose
 * 
 */

function fn1(x) {
  return x + 1
}
function fn2(x) {
  return x + 2
}
function fn3(x) {
  return x + 3
}
function fn4(x) {
  return x + 4
}

// 自己手写实现的 ok
// function compose(...args) {
//   return function () {
//     let val = arguments[0]
//     for (let index = 0; index < args.length; index++) {
//       const element = args[index]
//       val = element(val)
//     }
//     return val
//   }
// }

// 文章中的实现 
function compose (...fn){
  if (!fn.length) return v=>v
  if (fn.length===1) return fn[0]
  return fn.reduce((pre,cur)=>{
    return (...args)=>{
      return pre(cur(...args))
    }
  })
}
var a = compose(fn1, fn2, fn3, fn4)
console.log(a(1)) // 打印 11